package leedcode_path.回溯;

import java.util.ArrayList;
import java.util.List;

public class 复原IP地址 {
    /*
    * 有效 IP 地址 正好由四个整数（每个整数位于 0 到 255 之间组成，且不能含有前导 0），整数之间用 '.' 分隔。

例如："0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址，但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ，用以表示一个 IP 地址，返回所有可能的有效 IP 地址，这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例 1：
输入：s = "25525511135"
输出：["255.255.11.135","255.255.111.35"]
示例 2：
输入：s = "0000"
输出：["0.0.0.0"]
示例 3：
输入：s = "101023"
输出：["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
 */
    List<String> res = new ArrayList<String>();

    public List<String> restoreIpAddresses(String s) {
        StringBuffer sb=new StringBuffer(s);
        backtracking(sb,0,0);
return res;
    }
    public void backtracking(StringBuffer sb,int startindex,int pointsum){
        if (pointsum==3){
            if (isvaild(sb,startindex,sb.length()-1)){
                res.add(new String(sb));
            }
            return;
        }
        for (int i = startindex; i < sb.length()-1; i++) {
            if (isvaild(sb,startindex,i)){
                sb.insert(i+1,".");
                pointsum+=1;
                backtracking(sb,i+2,pointsum);
                pointsum-=1;
                sb.deleteCharAt(i+1);
            }
        }

    }

    /*前闭后闭*/
    private boolean isvaild(StringBuffer s, int start, int end) {
        if (s.charAt(start)=='0'&&start!=end){
            return false;
        }
        int num=Integer.parseInt(s.substring(start,end+1));
        if (end-start>2)return false;
        if (num>255||num<0){
            return false;
        }
        return true;

    }

}
